package com.ygkj.demo;


import android.os.Build;
import androidx.annotation.RequiresApi;

import javax.crypto.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;

public class EncrypAESUtils {

    //KeyGenerator 提供对称密钥生成器的功能，支持各种算法
    private KeyGenerator keygen;
    //加密密钥
//    private String password = "Tw3gs65ddl6kR42E1fdGs3df5W#9%g6dhT4593dfg7a345R8dfh#5274J@f1123*r657%R#";
    private String password = "Tw3gs65ddl6kR42E1fdGs3df5W#9%g6dhT4593dfg7a345R8dfh#5274J@f1123*r657%R#";
    //SecretKey 负责保存对称密钥
    private SecretKey deskey;
    //Cipher负责完成加密或解密工作
    private Cipher c;
    //该字节数组负责保存加密的结果
    private byte[] cipherByte;

    public void init() throws NoSuchAlgorithmException, NoSuchPaddingException{
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        //实例化支持DES算法的密钥生成器(算法名称命名需按规定，否则抛出异常)
        keygen = KeyGenerator.getInstance("AES");
        keygen.init(128, new SecureRandom(password.getBytes()));
        //生成密钥
        deskey = keygen.generateKey();
        //生成Cipher对象,指定其支持的DES算法
        c = Cipher.getInstance("AES");
    }

    /**
     * 对字符串加密
     */
    public byte[] Encrytor(String str) throws InvalidKeyException,
            IllegalBlockSizeException, BadPaddingException {
        // 根据密钥，对Cipher对象进行初始化，ENCRYPT_MODE表示加密模式
        c.init(Cipher.ENCRYPT_MODE, deskey);
        byte[] src = str.getBytes();
        // 加密，结果保存进cipherByte
        cipherByte = c.doFinal(src);
        return cipherByte;
    }

    /**
     * 对字符串解密
     */
    public byte[] Decryptor(byte[] buff) throws InvalidKeyException,
            IllegalBlockSizeException, BadPaddingException {
        // 根据密钥，对Cipher对象进行初始化，DECRYPT_MODE表示加密模式
        c.init(Cipher.DECRYPT_MODE, deskey);
        cipherByte = c.doFinal(buff);
        return cipherByte;
    }

    /**
     * 主函数
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static void main(String[] args) throws Exception {
        Base64.Decoder decoder = Base64.getDecoder();
        Base64.Encoder encoder = Base64.getEncoder();
        EncrypAESUtils de1 = new EncrypAESUtils();
        de1.init();
        String msg ="You are not alone.你好啊！";
        // aes加密数据
        byte[] encontent = de1.Encrytor(msg);
        // base64编码加密数据
        String encoderStr = encoder.encodeToString(encontent);
        System.out.println(encoderStr);

//        String dataStr = "{\"data\":\"hUVT0SbO7TL+s5gMtt9YaqxUir8RkT3qD0EyM3vGIERYJxIqP+N8qE8Pv8phFgHWU0mS2SB3FS2nqca6RPNj2Q==\",\"encrypt\":\"1\",\"type\":\"1009\"}";
//        String dataStr = "{\"data\":\"zevEH0sRshLaT5VaOArYPODtqCCS+FcjsKsXRUyZJGbfcKoUmIeSAb95k3i+Syg3eL90w4Lk4+DhAj2AfTAqv2aTyoELdtSLpGf/ruNO8o0=\",\"encrypt\":\"1\",\"type\":\"1005\"}";
//        CommonReq commonReq = JSON.parseObject(dataStr, CommonReq.class);
//        byte[] decoderByte = decoder.decode(commonReq.getData().toString());

        // base64解码数据
//        byte[] decoderByte = decoder.decode("zevEH0sRshLaT5VaOArYPODtqCCS+FcjsKsXRUyZJGbfcKoUmIeSAb95k3i+Syg3eL90w4Lk4+DhAj2AfTAqv2aTyoELdtSLpGf/ruNO8o0=");
        byte[] decoderByte = decoder.decode("KKnNFnxZ/DZPfOhBZ5uwQ3LyPV2jNmw+XpwIYTpF7VfwmnBeRdeP2yR1MHLr2ymHiGIJldymJe6friO+trtFrC9hFC+1r4Cx+SQ79dnzvf0XlS9G/H+knlLbBM+1J0Bv+1G279+IO0mm6DjdI5Rkt69UOI8MxuM2GtP9DPSGGqRajxwql8D+TSLe3rQQXtQzAvgs4K4oXN9ZSLi+XFF0+e79JDqpGHXm83EUsF031k//g2JThxHzaPAHD7gRsAV0rOButKnvAQ08PzhNLqFpsg==");
        // aes解密数据
        byte[] decontent = de1.Decryptor(decoderByte);
        System.out.println("明文是:" + msg);
        System.out.println("加密后:" + new String(encontent));
        System.out.println("解密后:" + new String(decontent));
    }

}
